/**
 * Copyright 2010-2012 Jcorp
 */

#ifndef MICROSCHEME_H
#define MICROSCHEME_H

#include <QObject>
#include <QVector>

#include "baseelement.h"
#include "signalcontainer.h"
#include "xmlhelper.h"

//Класс, кординирующий работу всех компонентов схемы
class MicroScheme : public QObject
{
    Q_OBJECT

public:
    //Создать схему
    MicroScheme();

    //Деструктор
    ~MicroScheme();

    // =========== Fields =========

    //Элементы схемы
    QVector<BaseElement*> elements;

    //Название схемы
    QString title;

    //Описание
    QString description;

    //Автор
    QString author;

    //Размер холста в
    QSize canvasSize;

    // =========== Methods =========

    //Проверить имя элемента на уникальность
    bool checkElementName(const BaseElement& element,const QString& newname);

    //Поиск элемента по имени
    BaseElement* searchElementByName(const QString& name);

    //Подобрать незанятое имя для нового элемента
    QString newElementName(const BaseElement& element);

    //Подобрать незанятое имя для нового элемента по названию типа
    QString newElementName(const QString &elementtype);

    //Добавить элемент в схему
    void appendObject(BaseElement* element);

    //Удалить объект из схемы
    void disposeObject(BaseElement* element);

    //Привести схему в исходное состояние
    void reset();

    //Запуск выполнения в реальном времени
    void run();

    void step();

    static MicroScheme* loadFromNode(QDomDocument &domDoc);

    // Сохранить в узел xml-документаa
    static QDomElement saveToNode(MicroScheme* scheme, QDomDocument &domDoc);
private:
    //Время в пикосекундах
    uint64_t time;
};

#endif // MICROSCHEME_H
